﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.Linq;
using Inventione.Framework.BusinessLogic;
using Inventione.Outsourcing.DataAccess;
using Inventione.Outsourcing.DataLinq;
using Inventione.Framework.DataAccess;
using Inventione.Framework.DataAccess.Exceptions;
using Inventione.Framework.BusinessLogic.Exceptions;

namespace Inventione.Outsourcing.BusinessLogic
{
    public class BLTipoOcorrencia : BLBase
    {
        // Representa o objeto de acesso a dados
        private DATipoOcorrencia da = null;

        /// <summary>
        /// Construtor padrão
        /// </summary>
        public BLTipoOcorrencia()
            : base("DEFAULT")
        {
            da = new DATipoOcorrencia("DEFAULT");
        }

        /// <summary>
        /// Construtor utilizando o cliente
        /// </summary>
        /// <param name="tenantId">Identificador do cliente</param>
        public BLTipoOcorrencia(string tenantId)
            : base(tenantId)
        {
            da = new DATipoOcorrencia(tenantId);  
        }


        /// <summary>
        /// Consulta tipos de ocorrência (utilizando vários critérios opcionais)
        /// </summary>
        /// <param name="cdContrato">Contrato que o tipo está associado</param>
        /// <param name="dsTipoOcorrencia">Descrição do tipo de ocorrência</param>
        /// <param name="inNatureza">Natureza do tipo de ocorrência (C - Crédito / D-Débito / N-Neutro)</param>
        /// <param name="inAtivo">Indicador se está ativo ou inativo (S/N)</param>
        /// <param name="maximumRows">Quantidade máxima de linhas de retorno</param>
        /// <param name="startRowIndex">Linha inicial de retorno</param>
        /// <param name="sortExpression">Compo para ordenação</param>
        /// <returns>Lista de tipos de ocorrência</returns>
        public List<TIPO_OCORRENCIA> consultarTipoOcorrencia(int cdContrato, string dsTipoOcorrencia, string inNatureza, string inAtivo, int maximumRows, int startRowIndex, string sortExpression)
        {
            List<TIPO_OCORRENCIA> retorno = null;

            try
            {
                retorno = this.da.consultarTipoOcorrencia(cdContrato, dsTipoOcorrencia, inNatureza, inAtivo, maximumRows, startRowIndex, sortExpression);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }

            return retorno;
        }


        /// <summary>
        /// Consulta tipos de ocorrência (utilizando vários critérios opcionais)
        /// </summary>
        /// <param name="cdContrato">Contrato que o tipo está associado</param>
        /// <param name="dsTipoOcorrencia">Descrição do tipo de ocorrência</param>
        /// <param name="inNatureza">Natureza do tipo de ocorrência (C - Crédito / D-Débito / N-Neutro)</param>
        /// <param name="inAtivo">Indicador se está ativo ou inativo (S/N)</param>
        /// <returns>Quantidade de registros atingidos pela consulta</returns>
        public int consultarTipoOcorrenciaCount(int cdContrato, string dsTipoOcorrencia, string inNatureza, string inAtivo)
        {
            int retorno = 0;

            try
            {
                retorno = da.consultarTipoOcorrenciaCount(cdContrato, dsTipoOcorrencia, inNatureza, inAtivo);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }

            return retorno;
        }

        /// <summary>
        /// Obtem um tipo de ocorrência
        /// </summary>
        /// <param name="cdTipoOcorrencia">Código do tipo de ocorrência</param>
        /// <returns>Entidade tipo de ocorrência</returns>
        public TIPO_OCORRENCIA obterTipoOcorrencia(int cdTipoOcorrencia)
        {
            TIPO_OCORRENCIA retorno = null;

            try
            {
                retorno = da.obterTipoOcorrencia(cdTipoOcorrencia);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }

            return retorno;
        }

        /// <summary>
        /// Obtem um tipo de ocorrência
        /// </summary>
        /// <param name="cdTipoOcorrencia">Código do tipo de ocorrência</param>
        /// <returns>Entidade tipo de ocorrência</returns>
        public List<TIPO_OCORRENCIA> listarTipoOcorrencia(int cdTipoOcorrencia)
        {
            List<TIPO_OCORRENCIA> retorno = null;

            try
            {
                retorno = this.da.listarTipoOcorrencia(cdTipoOcorrencia);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }

            return retorno;
        }

        /// <summary>
        /// Lista tipos de ocorrência ativos
        /// </summary>
        /// <param name="cdContrato">Contrato que o tipo está associado</param>
        /// <returns>Lista os tipos de ocorrência</returns>
        public List<TIPO_OCORRENCIA> listarTiposOcorrenciaAtivos(int cdContrato)
        {
            List<TIPO_OCORRENCIA> retorno = null;

            try
            {
                retorno = this.da.listarTiposOcorrenciaAtivos(cdContrato);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }

            return retorno;
        }

        /// <summary>
        /// Lista tipos de ocorrência ativos para ser utilizado na combo
        /// </summary>
        /// <param name="cdContrato">Contrato que o tipo está associado</param>
        /// <returns>Lista de itens para combo</returns>
        public List<TOCombo> listarTiposOcorrenciaContratoCombo(int cdContrato)
        {
            List<TOCombo> retorno = null;

            try
            {
                retorno = this.da.listarTiposOcorrenciaContratoCombo(cdContrato);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }

            return retorno;
        }


        #region Métodos básicos - CRUD

        /// <summary>
        /// Insere um tipo de ocorrência
        /// </summary>
        /// <param name="entity">Entidade tipo de ocorrência</param>
        /// <returns>Código do tipo de ocorrência</returns>
        public int inserirTipoOcorrencia(TIPO_OCORRENCIA entity)
        {
            int retorno = 0;

            try
            {
                retorno = this.da.inserirTipoOcorrencia(entity);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }

            return retorno;
        }

        /// <summary>
        /// Atualiza os dados de um tipo ocorrência
        /// </summary>
        /// <param name="entity">Entidade tipo ocorrência</param>
        public void atualizarTipoOcorrencia(TIPO_OCORRENCIA entity)
        {
            try
            {
                this.da.atualizarTipoOcorrencia(entity);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }
        }

        /// <summary>
        /// Exclui um tipo ocorrência
        /// </summary>
        /// <param name="entity">Entidade tipo ocorrência</param>
        public void excluirTipoOcorrencia(TIPO_OCORRENCIA entity)
        {
            try
            {
                this.da.excluirTipoOcorrencia(entity);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }
        }

        #endregion
    }
}
